#include "Phy_Driver.h"
#include "DL_CH.h"
#include "main.h"
//#include "tim.h"
//#include "usart.h"
//#include "gpio.h"
#include <stdio.h>
#include <math.h>

/********************
     暂时排除在工程外 8.3

****************/

//建立通讯后的回调函数，此函数被IRQ中断处理程序调用
void EstCom_Sucess_Callback(uint8_t Port){
     //如果CQ通讯建立
       //所有端口都受到Event，但是只有正在建立通讯的端口起作用
            Event_Response_COM1_2_3(Port); //通知Mode 
            Event_Response_OK(Port);       //通知MH
	   //读取Max14819，获得COM速度
	  //待更新
	
	  #ifdef __DEBUG__
	     
	  #endif
  
}
//建立通讯失败的回调函数
void EstCom_Failed_Callback(uint8_t Port){
  Event_Retry_Equel_3(Port);    //通知Mode Handler
  Event_Response_not_OK(Port);  //通知MH
  
    
}

void EstCOM(uint8_t Port){
   //不同端口使用不同的SPI 
   //EstCOM_bit置位
	#ifdef __MAX14819__
	   
	#endif
	
	#ifdef __DEBUG__  //如果调试阶段，则使用串口替代
	   printf("this is  WURQ\n");
	   printf("tm_Tdmt\n");
	   printf("send MC =0xA2 testing COM\n");
	   EstCom_Sucess_Callback(Port); //建立好通讯
	#endif
}

//发送MC序列
      
void Send_MC(uint8_t Port ){
  //待发送的数据存储在MC缓冲区BasicBufferInOut中
  MY_Update_MC_Struct2(Port); //更新待发送数据结构
 

	
  #ifdef __MAX14819__
     //通过SPI发送Buffer数据
  #endif 
	    
	#ifdef __DEBUG__
	      HAL_UART_Transmit(&huart1,MC_Struct[Port].MC,*MC_Struct[Port].TxBytes,1000);
	      HAL_UART_Receive_IT(&huart1,MC_Struct[Port].RecevieBuffer+2,*MC_Struct[Port].RxBytes);
	     //	Event_No_error(Port);
	
	#endif 
}

//接收MC序列成功,当产生接收中断(RxDataRdy，通过IRQ引脚)或者RXRDY引脚被下拉后，后调用此函数
void Receive_MC_Success_Callback(uint8_t Port ){
   //接收数据存储在MC缓冲区BasicBufferInOut中
   //*************
	
	Event_No_error(Port);
 
  
   
  
}


//解析接收到的MC
void Explain_Recieved_MC(uint8_t Port){
   // 解析CKS，获得PDInStatus的值，如果值有变化则

   Event_PDInStatus(Port);// 通知CH PDin状态改变
   


}

//接收MC序列失败,当产生接收中断(RxError，通过IRQ引脚)或者RXERR引脚被下拉后，后调用此函数
void Receive_MC_Failed(uint8_t Port){
   //****************
 
 
   Event_Response_not_OK(Port);

}


void StartISDUTimer(uint8_t Port){
    //启动ISDU定时器
}

void StopISDUTimer(uint8_t Port){
    
}

void ISDUTimer_Callback(uint8_t Port){
   //ISDU定时器溢出事件

}


void StartCycleTimer(uint8_t Port){
	   //启动Operate操作周期定时器（软定时器，硬定时器没那么多）
    #ifdef __DEBUG__   //调试用硬定时器
	       htim1.Init.Period = 100; //10ms周期
	       HAL_TIM_Base_Init(&htim1);
	       HAL_TIM_Base_Start_IT(&htim1);
	
	  #endif
	
}

void StopCycleTimer(uint8_t Port){
	
	  #ifdef __DEBUG__
	       
	     HAL_TIM_Base_Stop_IT(&htim1); //停止周期
	  #endif
	
}
//Cycler定时器启动后 回调函数
void CyclerTimerCallback(uint8_t Port){
	  //每次周期开始时调用
	   Event_Tcyc(Port);
	  
}


//读取Max14819寄存器。获得COM速度
COM_Speed_TYPE Get_COM_Speed(uint8_t Port){
    
	 //待更改
	#ifdef __DEBUG__
	   COM_Speed_TYPE Speed=COM_Speed1;
	   if(Speed==COM_Speed1){
			   Tbit[Port]=20833;			   
		 }
		 else if(Speed==COM_Speed2){
			   Tbit[Port]=2604;
		 }
     else{
			   Tbit[Port]=434;
		 }
		 return Speed;
	
	#endif
	
}

/******************延时函数*********************/
//延时一个MC周期
void Delay_T_Mc(uint8_t Port){
		  uint32_t Time_by_Tbit=(MC_Struct[Port].ODLength+MC_Struct[Port].PDInputLength+MC_Struct[Port].PDOutputLength+3)*14+10;  //按照图A.15计算延时时间
	Time_by_Tbit=round((Time_by_Tbit*Tbit[Port])/1000)*2; //若干ms后改变主站状态，此延时可以是操作系统函数或物理延时 
	    HAL_Delay(Time_by_Tbit);
}


/********************标准物理层服务***************************/
//将接口转换到IO-LINK模式
void Service_PL_SetMode_SDCI(uint8_t Port){
   
}

void Service_PL_SetMode_DI(uint8_t Port){

}

void Service_PL_SetMode_DO(uint8_t Port){

}

void PL_Wake_Up(uint8_t Port){
	
}


/************Falsh操作****************/
 //将SMI配置的ConfigList存储到Flash
 void Save_Data_To_FlashROM(uint32_t FlashAddress,void * Data,uint8_t DataSize){
    
 }

void Read_Data_From_FlashROM(uint32_t FlashAddress,void * Data,uint8_t DataSize){
    
 }
    
void Delete_DS_Data_In_FlashROM(void){
   
}



/*****************直接硬件操作*******************/

//当不用帧生成器时候，而是直接使用串口的时候使用
void set_COM_Speed(uint8_t Port,uint32_t speed){
	
}

void Set_Timer_of_Tdwu(uint8_t Port){
}





void Set_Timer_of_Tdmt(uint8_t Port,uint16_t time){
}


//与stm32有关的 回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart){
	Receive_MC_Success_Callback(1);
	
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim){
	       CyclerTimerCallback(1); 
	      
}


//*************调试用针对UART2 重定向  Scanf 和Printf重定向***********************
int fputc(int c,FILE *stream){
	   huart2.Instance->DR=c;
      while(!(huart2.Instance->SR&(1<<7))){};
				return c;
	
}

int fgetc(FILE *stream){
	  while(!(huart2.Instance->SR&(1<<5))){};
			return huart2.Instance->DR;
	
}